//
//  R+Ext.swift
//  
//
//  Created by bo wang on 2020/10/3.
//  Copyright © 2020 wangbo. All rights reserved.
//

import Foundation
import Rswift
//extension R {
//    typealias reuseId = R.reuseIdentifier
//}
extension UITableView {
    
    func dequeueCell<T: ReuseIdentifierType>(_ identifier: T,
                                             for indexPath: IndexPath)
    -> T.ReusableType
    where T.ReusableType: UITableViewCell {
        return dequeueReusableCell(withIdentifier: identifier.identifier, for: indexPath) as! T.ReusableType
    }
    
    func dequeueView<T: ReuseIdentifierType>(_ identifier: T)
    -> T.ReusableType
    where T.ReusableType: UITableViewHeaderFooterView {
        return dequeueReusableHeaderFooterView(withIdentifier: identifier.identifier) as! T.ReusableType
    }
}

extension UICollectionView {
    func dequeueCell<T: ReuseIdentifierType>(_ identifier: T,for indexPath: IndexPath)-> T.ReusableType
    where T.ReusableType: UICollectionReusableView
    {
        return dequeueReusableCell(withReuseIdentifier: identifier.identifier, for: indexPath) as! T.ReusableType
    }
    
    func dequeueHeader<T: ReuseIdentifierType>(_ identifier: T,
                                               for indexPath: IndexPath)
    -> T.ReusableType
    where T.ReusableType: UICollectionReusableView {
        return dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: identifier.identifier, for: indexPath) as! T.ReusableType
    }
    
    func dequeueFooter<T: ReuseIdentifierType>(_ identifier: T,
                                               for indexPath: IndexPath)
    -> T.ReusableType
    where T.ReusableType: UICollectionReusableView {
        return dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: identifier.identifier, for: indexPath) as! T.ReusableType
    }
    
    func dequeueView<T: ReuseIdentifierType>(_ identifier: T,
                                             ofKind elementKind: String,
                                             for indexPath: IndexPath)
    -> T.ReusableType
    where T.ReusableType: UICollectionReusableView {
        return dequeueReusableSupplementaryView(ofKind: elementKind, withReuseIdentifier: identifier.identifier, for: indexPath) as! T.ReusableType
    }
}
